package com.xbongbong.util;

import com.xbongbong.paas.enums.FieldTypeEnum;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.pro.enums.SaasMarkEnum;

import java.util.Objects;

/**
 * @author 吴峰
 * @date 2021/05/28 10:45
 */
public class FilterExplainUtil {



    /**
     * 过滤掉字段
     * @param item                      当前字段实体
     * @param saasMark                  当前表单的saas标识或者关联数据的关联表单saas标识
     * @param businessType              当前表单的业务类型
     * @param fieldBusinessType         目标表单的业务类型或者关联数据的关联表单业务类型
     * @param fieldType                 目标字段的类型
     * @param condition                 是否是条件，true：过滤条件；false：操作方式
     * @param formId                    当前表单的表单id
     * @param linkFormId                目标表单的表单id或者关联数据的关联表单id
     * @return true：过滤这个字段 false：不过滤这个字段
     */
    public static boolean filterField(FieldAttrEntity item, Integer saasMark, Integer businessType, Integer fieldBusinessType, boolean condition, Long formId, Long linkFormId, Integer fieldType) {
        // 联动表单字段是关联数据时，目标字段可以是关联数据或关联数据多选
        boolean targetLinkData = Objects.equals(FieldTypeEnum.LINK_DATA.getType(), item.getFieldType()) && (Objects.equals(FieldTypeEnum.LINK_DATA.getType(), fieldType) || Objects.equals(FieldTypeEnum.LINK_DATA_MULTI.getType(), fieldType));
        // 联动表单字段是关联数据多选时，目标字段可以是关联数据多选
        boolean targetLinkDataMulti = Objects.equals(FieldTypeEnum.LINK_DATA_MULTI.getType(), item.getFieldType()) && Objects.equals(FieldTypeEnum.LINK_DATA_MULTI.getType(), fieldType);
        boolean isLinkData = targetLinkData || targetLinkDataMulti;

        if (condition) {
            if (Objects.equals(FieldTypeEnum.LINK_BUSINESS_SINGLE.getType(), item.getFieldType())
                    && Objects.equals(FieldTypeEnum.LINK_BUSINESS_SINGLE.getType(), fieldType) && !Objects.equals(item.getLinkedType(), fieldBusinessType)) {
                return true;
            } else if (Objects.equals(FieldTypeEnum.LINK_DATA.getType(), item.getFieldType()) && Objects.equals(FieldTypeEnum.LINK_BUSINESS_SINGLE.getType(), fieldType)
                    && !Objects.equals(item.getLinkInfo().getLinkBusinessType(), fieldBusinessType)) {
                return true;
            } else if (Objects.equals(FieldTypeEnum.LINK_BUSINESS_SINGLE.getType(), item.getFieldType()) && Objects.equals(FieldTypeEnum.LINK_DATA.getType(), fieldType)
                    && !Objects.equals(fieldBusinessType, item.getLinkedType())) {
                return true;
            } else if (isLinkData
                    && Objects.equals(SaasMarkEnum.SAAS.getCode(), item.getLinkInfo().getLinkSaasMark()) && !Objects.equals(businessType, fieldBusinessType)) {
                // 过滤条件中：目标关联数据并且是过滤条件时，saas表单判断业务类型
                return true;
            } else if (isLinkData
                    && Objects.equals(SaasMarkEnum.PAAS.getCode(),  item.getLinkInfo().getLinkSaasMark()) && !Objects.equals(formId, linkFormId)) {
                // 过滤条件中：目标关联数据并且是过滤条件时，paas表单判断表单id一致
                return true;
            } else if (Objects.equals(FieldTypeEnum.DATAID.getType(), fieldType) && Objects.equals(FieldTypeEnum.LINK_BUSINESS_SINGLE.getType(), item.getFieldType())
                    && !Objects.equals(item.getLinkedType(), fieldBusinessType)) {
                // 过滤条件中：目标表单为所选数据，当前表单为系统关联字段时，系统关联字段的业务类型需要和目标表单的业务类型一致
                return true;
            } else if (Objects.equals(FieldTypeEnum.DATAID.getType(), fieldType) && Objects.equals(FieldTypeEnum.LINK_DATA.getType(), item.getFieldType())
                    && !Objects.equals(linkFormId, item.getLinkInfo().getLinkFormId())) {
                return true;
            }
        }else {
            if (Objects.equals(FieldTypeEnum.LINK_BUSINESS_SINGLE.getType(), item.getFieldType())
                    && Objects.equals(SaasMarkEnum.SAAS.getCode(), saasMark) && !Objects.equals(item.getLinkedType(), fieldBusinessType)) {
                return true;
            } else if (isLinkData
                    && !Objects.equals(item.getLinkInfo().getLinkBusinessType(), fieldBusinessType) && !Objects.equals(item.getLinkInfo().getLinkFormId(), linkFormId)) {
                // 操作中：关联数据必须业务相等，表单id相等
                return true;
            }
        }

        return false;
    }
}
